package com.jiawa.train.common.controller;

import com.jiawa.train.common.exception.BusinessException;
import com.jiawa.train.common.resp.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;



//这个类主要是用来拦截controller的异常处理，对异常处理进行统一的封装返回到前端
//这个ControllerAdvice注解是spring提供的异常拦截的注解
@ControllerAdvice
public class ControllerExceptionHandler
{
    //获取当前类的日志记录器的实例，或者使用lombok提供的@Slf4j注解

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);
    //统一异常处理，这个ExceptionHandler注解是spring提供的异常处理注解用来捕获Controller抛出的异常
    @ExceptionHandler(value = BusinessException.class) // 业务异常
    @ResponseBody
    public Result<?> handleBusinessException(BusinessException e) {
        LOG.error("业务异常：{}", e);
        return Result.error(e.getE().getDesc());
    }

    @ExceptionHandler(value = Exception.class)//其他异常
    @ResponseBody
    public Result<?> exceptionHandler(Exception e) {
        LOG.error("系统异常：{}", e);
        return Result.error("系统出现异常，请联系管理员！");
    }
    @ExceptionHandler(value = BindException.class)//校验异常
    @ResponseBody
    public Result<?> exceptionHandler(BindException e) {
        LOG.error("校验异常：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return Result.error( e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    }

}
